#include "kasm.h"
#include "rtc.h"
#include "print.h"
#include "video.h"
#include "kc.h"
#include "video.h"

#define RTC_ADDRESS 0x70
#define RTC_DATA 0x71

#define RTC_SECONDS 0x00
#define RTC_SECONDS_A 0x01
#define RTC_MINUTES 0x02
#define RTC_MINUTES_A 0x03
#define RTC_HOURS 0x04
#define RTC_HOURS_A 0x05
#define RTC_DAY_OF_WEEK 0x06
#define RTC_DAY_OF_MONTH 0x07
#define RTC_MONTH 0x08
#define RTC_YEAR 0x09

/* Posicion en pantalla de fecha y hora */
#define ROW_RTC 24
#define COL_RTC 60


extern int actualAtribute;


/*
 * muestra en la ultima linea de la pantalla
 * la fecha y la hora del Real Time Clock
 */
void
showClock(void)
{
	byte year, month, day, seconds, minutes, hours, backup_atribute;
	int backup_row, backup_col;

	getCursorPosition(&backup_row, &backup_col);
	setCursorPosition(ROW_RTC, COL_RTC);
	
	backup_atribute=actualAtribute;
	actualAtribute=RTC_TXT;

	year = getRTCyear();
	month = getRTCmonth();
	day = getRTCdayofmonth();
	 
	seconds = getRTCseconds();
	minutes = getRTCminutes();
	hours = getRTChours();

	
	printBCDNum(day);
	printAtRTCline('/');
	printBCDNum(month);
	printAtRTCline('/');
	printBCDNum(year);
	printAtRTCline(' ');
	printAtRTCline(' ');
	printAtRTCline(' ');
	printBCDNum(hours);
	printAtRTCline(':');
	printBCDNum(minutes);
	printAtRTCline(':');
	printBCDNum(seconds);
	
	setCursorPosition(backup_row, backup_col);
	actualAtribute=backup_atribute;
	return;
}

/*
 * inicializa la "pantalla del reloj"
 * cambiando los atributos y poniendo ' ' en cada 
 * columna de la ultima fila de la pantalla.
 * solo hace falta llamarla una vez.
 * */
void
showClockFrame(void)
{
	int i, backup_row, backup_col, backup_atribute;

	getCursorPosition(&backup_row, &backup_col);
	setCursorPosition(ROW_RTC, 0);
	backup_atribute=actualAtribute;

	actualAtribute=RTC_TXT;

	for(i=0; i <SCREEN_WIDE; i++)
	{
		printAtRTCline(' ');
	}	

	setCursorPosition(backup_row, backup_col);
	actualAtribute=backup_atribute;
	return;
	
}


/*
 * retorna los segundos del RTC (en formato BCD)
 */
byte 
getRTCseconds(void)
{
	byte seconds;
	
	portOut(RTC_ADDRESS, RTC_SECONDS);
	seconds=portIn(RTC_DATA);
	return seconds;
}

/*
 * setea los segundos del RTC (en formato BCD)
 */
void
putRTCseconds(byte seconds)
{
	portOut(RTC_ADDRESS, RTC_SECONDS);
	portOut(RTC_DATA, seconds);
	
	return;
}

/*
 * retorna los minutos del RTC (en formato BCD)
 */
byte 
getRTCminutes(void)
{
	byte minutes;
	
	portOut(RTC_ADDRESS, RTC_MINUTES);
	minutes=portIn(RTC_DATA);
	return minutes;
}

/*
 * seta los minutos del RTC (en formato BCD)
 */
void
putRTCminutes(byte minutes)
{
	portOut(RTC_ADDRESS, RTC_MINUTES);
	portOut(RTC_DATA, minutes);
	
	return;
}

/*
 * retorna las horas del RTC (en formato BCD)
 */
byte 
getRTChours(void)
{
	byte hours;
	
	portOut(RTC_ADDRESS, RTC_HOURS);
	hours=portIn(RTC_DATA);
	return hours;
}

/*
 * setea las horas del RTC (en formato BCD)
 */
void
putRTChours(byte hours)
{
	portOut(RTC_ADDRESS, RTC_HOURS);
	portOut(RTC_DATA, hours);
	
	return;
}

/*
 * retorna el dia del mes del RTC (en formato BCD)
 */
byte 
getRTCdayofmonth(void)
{
	byte day;
	
	portOut(RTC_ADDRESS, RTC_DAY_OF_MONTH);
	day=portIn(RTC_DATA);
	return day;
}

/*
 * setea el dia del mes del RTC (en formato BCD)
 */
void
putRTCdayofmonth(byte day)
{
	portOut(RTC_ADDRESS, RTC_DAY_OF_MONTH);
	portOut(RTC_DATA, day);
	
	return;
}

/*
 * retorna el mes del RTC (en formato BCD)
 */
byte 
getRTCmonth(void)
{
	byte month;
	
	portOut(RTC_ADDRESS, RTC_MONTH);
	month=portIn(RTC_DATA);
	return month;
}

/*
 * setea el mes del RTC (en formato BCD)
 */
void
putRTCmonth(byte month)
{
	portOut(RTC_ADDRESS, RTC_MONTH);
	portOut(RTC_DATA, month);
	
	return;
}

/*
 * retorna el anio del RTC (en formato BCD)
 */
byte 
getRTCyear(void)
{
	byte year;
	
	portOut(RTC_ADDRESS, RTC_YEAR);
	year=portIn(RTC_DATA);
	return year;
}

/*
 * setea el anio del RTC (en formato BCD)
 */
void
putRTCyear(byte year)
{
	portOut(RTC_ADDRESS, RTC_YEAR);
	portOut(RTC_DATA, year);
	
	return;
}

